""""""
"""
______________________________
time：2021/5/28

封装一个类，实现对请求的处理：
1.url method param(传的参数要支持查询字符串参数、www-form、json)
2.可以传字典类型的参数，也支持传json字符串，支持传字典类型的字符串'{字典格式}'

补充：
导包习惯：
1.先导入系统的包，python提供的包；空一行；
2.再导第三方的包；空一行；
3.再导自己写的包，自己写的模块；
______________________________

"""

import requests
import json


class HandleRequest:
    """处理请求"""

    def __init__(self):
        self.one_session = requests.Session()

    def add_headers(self, headers):
        """添加公共请求头"""
        self.one_session.headers.update(headers)  # 字典的update方法默认对两个字典合并，如果存在相同的key,update方法会用后者覆盖前者

    def send(self, url, method='post', data=None, is_json=True, **kwargs):  # 因为data传的参数都不一样，指定默认值为None，或不指定也行
        # json_data = '{"code": 1,"empty": false,"msg": "操作成功"}'  # json格式的字符串
        # dict_data = '{"code": 1,"empty": False,"msg": "操作成功"}'  # 字典类型的字符串

        if isinstance(data, str):  # 判断返回的类型是否是字符串，是为True,不是为False
            try:
                # 将json格式的字符串转化为python中的数据类型:字典、嵌套字典的列表
                data = json.loads(data)  # 字典类型的字符串使用loads方法会报错，它不符合json的语法
            except Exception as e:
                print("使用日志器来记录日志")
                data = eval(data)  # 对字典类型的字符串进行转换，转换为dict

        method = method.lower()
        if method == "get":
            """
            如果给params传参，使用的是以查询字符串参数的形式来传递数据；get没有请求体，不能传data和json
            """
            # response = self.one_session.get(url, params=data, **kwargs)  # get实质也是发送的request请求，两个一样的
            response = self.one_session.request(method, url, params=data, **kwargs)
        elif method in ("post", "put", "delete", "patch"):  # 都有请求体的方法
            if is_json:  # 如果为True,那么以json格式的形式传参
                # response = self.one_session.post(method, url, json=data, **kwargs)
                response = self.one_session.request(method, url, json=data, **kwargs)
            else:  # 如果is_json为False,代表你传的就是表单的形式，那么就以x-www-form-urlencoded表单的形式传参
                response = self.one_session.request(method, url, data=data, **kwargs)
        else:
            response = None
            print(f"不支持【{method}】请求方法")
        return response

    def close(self):
        #调用会话对象的close方法是释放资源，还是可以继续发起请求的；
        self.one_session.close()


if __name__ == '__main__':
    # 1.构造请求的url
    login_url = "http://api.lemonban.com/futureloan/member/login"
    recharge_url = "http://api.lemonban.com/futureloan/member/recharge"
    # 2.创建请求参数
    headers = {"X-Lemonban-Media-Type": "lemonban.v2",
               "User-Agent": "Mozilla/5.0"
               }

    login_params = {
        "mobile_phone": "13073783188",
        "pwd": "111222333",
    }
    # 3.执行登录
    do_request = HandleRequest()  # 创建HandleRequest对象
    do_request.add_headers(headers)  # 添加公共请求头
    login_response = do_request.send(login_url, method='post', data=login_params, is_json=True)
    login_json_datas = login_response.json()
    member_id = login_json_datas['data']['id']
    token = login_json_datas['data']['token_info']['token']
    # 4.创建请求参数
    recharge_params = {
        "member_id": member_id,
        "amount": 1.66,
    }
    # 登录不需要验证Authorization，充值必须要
    token_headers = {"Authorization": "Bearer " + token}  # 拼接token的值，这个是他们项目设计规定的
    # update直接合并新加和已存在的，所以之前公共的不用再写一遍
    do_request.add_headers((token_headers))  # 请求头中添加token
    # 5.执行充值
    do_request.send(recharge_url, data=recharge_params)
    pass
